import { ChildsCompType } from "@/components/page-box/basic-table-box/comp-type";
import { BaseComponent } from "../type";
/**操作栏配置参数 */
export interface TableOperateType<T> {
	/** 名称 */
	name: string | ((e: any) => string);
	/** 类型 */
	type?: "primary" | "default" | "warning" | "danger" | "success";
	/** 图标 */
	icon?: string;
	/** 组件名称 */
	component?: ChildsCompType;
	/** 点击事件回调 */
	callback?: (e: T, i: number, data: Array<T>) => void;
	/** 是否禁用 */
	disabled?: boolean | ((e: any) => boolean);
	show?: boolean | ((e: any) => boolean);
}
/**表格列配置参数 */
export interface TableColsOptions<T> extends Omit<TableOperateType<T>, "icon"> {
	/** 表格列固定 */
	fixed?: boolean;
	/** 表格列宽度 */
	width?: string | number;
	/** 业务字段 */
	key: T;
	/** 格式化文本 */
	format?: "date" | "dateTime" | "money";
	/** 字典 */
	dict?: { [key: string]: string };
	/** 过滤回调，显示return的值 */
	filter?: (str: any, row: any, index: number, data: Array<T>) => any;
	callback?: (e: T, i: number, data: Array<T>) => any;
}
/**分页参数 */
export interface PaginatorOptions {
	/** 总数 */
	total: number;
	/** 分页数 */
	pageSize: number;
	/** 页数 */
	page: number;
	show?: boolean;
}
export interface TableResponse<T> {
	selectData: Array<T>;
	pageSize: number;
	page: number;
}
/**
 * 表格配置类型
 */
export interface TableOptions<T> {
	/** 表格数据 */
	source?: Array<T>;
	/** 是否多选 */
	selection?: boolean;
	/**初始化选项 */
	selectedRows?: Array<T>;
	/** 序号配置 */
	index?: Boolean;
	/** 表格配置 */
	columns?: Array<TableColsOptions<keyof T>>;
	/** 表格操作栏配置 */
	opers?: Array<TableOperateType<T>>;
	/** 操作栏宽度 */
	operateWidth?: string | number;
	/** 操作栏目位置 */
	operateFixed?: "left" | "right";
	/** 子表格配置 */
	treeProps?: LoadChildTableOptions<T>;
	paginator?: PaginatorOptions;
	changePage?: (pageConfig: Record<"pageSize" | "page", number>) => void;
	beforeOnMounted?: (pageConfig: Record<"pageSize" | "page", number>) => void;
	loading?: boolean;
}
export interface LoadChildTableOptions<T> {
	/** 行数据的 Key，详细查看element-plus文档 */
	rowKey: string;
	/** 是否懒加载子节点数据 */
	lazy?: boolean;
	/** 子节点数据key,渲染子表格的字段 */
	children?: string;
	/** 判断子表格是否存在需要懒加载时的数据 */
	hasChildren?: string;
	/** 懒加载的回调方法 */
	load?: (row: T, treeNode: unknown, resolve: (data: T[]) => void) => void;
}
export interface TableBox<Table> extends BaseComponent {
	/** 设置表格数据 */
	setTableSource(data: Array<Table>): void;
	/** 获取表格数据 */
	getTableSource(): Array<Table>;
	/**
	 * 新增表格列
	 * @param  col 表格列数据,其`key`必须对应源数据`source`的key
	 */
	addTableCol(col: TableColsOptions<keyof Table>): void;
	addTableCol(col: TableColsOptions<keyof Table>[]): void;
	/**
	 * 移除表格列
	 * @descibe  移除对应 key 的表格列
	 */
	removeTableCol(key: keyof Table): void;
	/** 获取当前表格列的配置项 */
	getTableColsConf(): Array<TableColsOptions<keyof Table>>;
	/**
	 * 新增表格操作栏
	 * @param { TableOperateType<Table> } opr 操作栏参数
	 */
	addTableOpr(opr: TableOperateType<Table>): void;
	/**
	 * 移除表格操作栏
	 * @param { string } name 移除操作栏中对应`name`的控件
	 */
	removeTableOpr(name: string): void;
	/**
	 * 设置操作栏目禁用
	 * @param { string } name 控件的`name` 属性
	 * @param { boolean } disabled 控件是否禁用
	 */
	setTableOprDisabled(name: string, disabled: boolean): void;
	/** 获取当前操作栏的配置项 */
	getTableOprConf(): TableOperateType<Table>[];
	/**
	 * 设置表格是否可以多选
	 * @param {boolean} state 是否多选
	 */
	setTableSelection(state: boolean): void;
	/**
	 * 是否添加表格序号
	 * @param {boolean} state 是否排序
	 */
	setTableIndex(state: boolean): void;
	/** 设置选中数据 */
	setTableSelectionData(rows: Array<Table>): void;
	/** 获取选中数据 */
	getTableSelectionData(): Array<Table>;
	/** 设置子表格 */
	setChildTable(options: LoadChildTableOptions<Table>): void;
	/** 设置总数 */
	setTotal(total: number): void;
}
